home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GEM / VDIOUTPU.I < prev    next >
Encoding:
Modula Implementation  |  1993-10-29  |  12.9 KB  |  454 lines

  1. IMPLEMENTATION MODULE VDIOutputs;
  2. (*$L-, N+, Y+*)
  3.  
  4.  
  5. (*  MEGAMAX MODULA 2 GEM-Library :  Die VDI Ausgabefunktionen
  6.  *
  7.  *  Autor: Manuel Chakravarty           Erstellt :  31.10.87
  8.  *
  9.  *  Version   2.2     V#0023
  10.  *)
  11.  
  12. (*  22.01.88 TT         | PolyLine: TST (A3)+ -> TST -(A3)
  13.  *  ???????? TT  V2.1   | REF-Parm.
  14.  *  02.04.90 MCH V2.2   | Anpassung an public arrays
  15.  *  26.03.91 TT         | PolyMarker: TST (A3)+ -> TST -(A3)
  16.  *)
  17.  
  18.  
  19. FROM    SYSTEM          IMPORT ASSEMBLER;
  20.  
  21. FROM    GrafBase        IMPORT Point, Rectangle, WritingMode;
  22.  
  23. IMPORT  MOSGlobals,GEMShare;
  24.  
  25. FROM    GEMEnv          IMPORT DeviceHandle;
  26.  
  27. (*$I GEMOPS.ICL *)
  28.  
  29.  
  30. PROCEDURE PolyLine(handle:DeviceHandle;REF pts:ARRAY OF Point;NoLines:CARDINAL);
  31.  
  32. BEGIN
  33.   ASSEMBLER
  34.         JSR     testErrorCheck
  35.         MOVE.W  -(A3),D1                ; last -> d1
  36.         MOVE.W  -(A3),D0                ; HIGH(pts) -> d0
  37.         TST.W   D1
  38.         BEQ     cont
  39.         CMP.W   D1,D0
  40.         BCS     cont
  41.         MOVE.W  D1,D0
  42. cont
  43.         
  44.         MOVE.W  D0,-(A7)
  45.         MOVE.W  D1,-(A7)
  46.         MOVE.L  -(A3),-(A7)
  47.         SUBQ.L  #2,A7
  48.         MOVE.L  A7,(A3)+
  49.         JSR     setDevice
  50.         MOVE.W  (A7)+,(A3)+
  51.         MOVE.L  (A7)+,A1
  52.         MOVE.W  (A7)+,D1
  53.         MOVE.W  (A7)+,D0
  54.         TST.W   -(A3)           ; !TT 22.01.88
  55.         BEQ     ende
  56.         
  57.         MOVE.L  our_cb,A0
  58.         MOVE.L  cb.VDIPB.ptsin(A0),-(A7); save old PTSIN addr
  59.         MOVE.L  A1,cb.VDIPB.ptsin(A0)   ; ADR(pts) -> Param.block
  60.         MOVE.L  A0,(A3)+                ; our_cb^ -> P.stack( für vdi_call)
  61.         MOVE.L  cb.CURDEVICE(A0),A1     ; set current device handle
  62.         MOVE.W  device.handle(A1),cb.V_CONTRL.handle(A0)
  63.         LEA     cb.V_CONTRL(A0),A0      ; Build up the control Array
  64.         MOVE.W  #POLYLINE,(A0)+
  65.         ADDQ.W  #1,D0
  66.         MOVE.W  D0,(A0)+
  67.         CLR.L   (A0)+
  68.         CLR.L   (A0)
  69.         JSR     vdi_call
  70.         MOVE.L  our_cb,A0               ; restore old PTSIN addr
  71.         MOVE.L  (A7)+,cb.VDIPB.ptsin(A0)
  72. ende
  73.   END;
  74. END PolyLine;
  75.  
  76. (*  callPolyMG -- Macht den gesamten Aufruf für die Funktionen          *
  77.  *                PolyMarker,Polygon.                                   *
  78.  *                In 'cmd' steht der VDI-Opcode der Funktion            *)
  79.  
  80. PROCEDURE callPolyMG(handle:DeviceHandle;REF pts:ARRAY OF Point;no:CARDINAL;
  81.                      cmd:CARDINAL);
  82.  
  83. BEGIN
  84.   ASSEMBLER
  85.         JSR     testErrorCheck
  86.         MOVE.W  -(A3),D2                ; cmd -> D2
  87.         MOVE.W  -(A3),D1                ; no -> D1
  88.         MOVE.W  -(A3),D0                ; HIGH(pts) -> D0
  89.         TST.W   D1
  90.         BEQ     useHIGH
  91.         CMP.W   D1,D0
  92.         BCS     useHIGH
  93.         MOVE.W  D1,D0
  94.         BRA     cont
  95. useHIGH
  96.         ADDQ.W  #1,D0
  97. cont
  98.         MOVE.W  D0,-(A7)
  99.         MOVE.W  D1,-(A7)
  100.         MOVE.W  D2,-(A7)
  101.         MOVE.L  -(A3),-(A7)             ; ADR (pts)
  102.         SUBQ.L  #2,A7
  103.         MOVE.L  A7,(A3)+
  104.         JSR     setDevice
  105.         MOVE.W  (A7)+,(A3)+
  106.         MOVE.L  (A7)+,A1
  107.         MOVE.W  (A7)+,D2
  108.         MOVE.W  (A7)+,D1
  109.         MOVE.W  (A7)+,D0
  110.         TST.W   -(A3)
  111.         BEQ     ende
  112.         
  113.         MOVE.L  our_cb,A0
  114.         MOVE.L  cb.VDIPB.ptsin(A0),-(A7); save old PTSIN addr
  115.         MOVE.L  A1,cb.VDIPB.ptsin(A0)   ; ADR(pts) -> Param.block
  116.         MOVE.L  A0,(A3)+                ; our_cb^ -> P.stack( für vdi_call)
  117.         MOVE.L  cb.CURDEVICE(A0),A1     ; set current device handle
  118.         MOVE.W  device.handle(A1),cb.V_CONTRL.handle(A0)
  119.         LEA     cb.V_CONTRL(A0),A0      ; Build up the control Array
  120.         MOVE.W  D2,(A0)+
  121.         MOVE.W  D0,(A0)+
  122.         CLR.L   (A0)+
  123.         CLR.L   (A0)
  124.         JSR     vdi_call
  125.         MOVE.L  our_cb,A0               ; restore old PTSIN addr
  126.         MOVE.L  (A7)+,cb.VDIPB.ptsin(A0)
  127. ende
  128.   END;
  129. END callPolyMG;
  130.  
  131. PROCEDURE PolyMarker
  132. (handle:DeviceHandle;REF marks:ARRAY OF Point;NoMarks:CARDINAL);
  133.  
  134. BEGIN
  135.   ASSEMBLER
  136.     MOVE.W      #POLYMARKER,(A3)+
  137.     JSR         callPolyMG
  138.   END;
  139. END PolyMarker;
  140.  
  141. PROCEDURE Polygon(handle:DeviceHandle;REF pts:ARRAY OF Point;NoEdges:CARDINAL);
  142.  
  143. BEGIN
  144.   ASSEMBLER
  145.     MOVE.W      #FILLED_AREA,(A3)+
  146.     JSR         callPolyMG
  147.   END;
  148. END Polygon;
  149.  
  150. PROCEDURE Line(handle:DeviceHandle;p,q:Point);
  151.  
  152. BEGIN
  153.   ASSEMBLER
  154.         MOVE.L  pubs,A0
  155.         MOVE.L  -(A3),pubArrays.PTSIN+$4(A0)
  156.         MOVE.L  -(A3),pubArrays.PTSIN(A0)
  157.         
  158.         SUBQ.L  #2,A7           ; device handle setzen
  159.         MOVE.L  A7,(A3)+
  160.         JSR     setDevice
  161.         TST.W   (A7)+
  162.         BEQ     ende
  163.         
  164.         MOVE.L  our_cb,A0
  165.         MOVE.L  A0,(A3)+                ; our_cb^ -> P.stack( für vdi_call)
  166.         MOVE.L  cb.CURDEVICE(A0),A1     ; set current device handle
  167.         MOVE.W  device.handle(A1),cb.V_CONTRL.handle(A0)
  168.         LEA     cb.V_CONTRL(A0),A0      ; Build up the control Array
  169.         MOVE.W  #POLYLINE,(A0)+
  170.         MOVE.W  #2,(A0)+
  171.         CLR.L   (A0)+
  172.         CLR.L   (A0)
  173.         JSR     vdi_call
  174. ende
  175.   END;
  176. END Line;
  177.  
  178. PROCEDURE Mark(handle:DeviceHandle;q:Point);
  179.  
  180. BEGIN
  181.   ASSEMBLER
  182.         MOVE.L  pubs,A0
  183.         MOVE.L  -(A3),pubArrays.PTSIN(A0)
  184.     
  185.         SUBQ.L  #2,A7           ; device handle setzen
  186.         MOVE.L  A7,(A3)+
  187.         JSR     setDevice
  188.         TST.W   (A7)+
  189.         BEQ     ende
  190.         
  191.         MOVE.L  our_cb,A0
  192.         MOVE.L  A0,(A3)+                ; our_cb^ -> P.stack( für vdi_call)
  193.         MOVE.L  cb.CURDEVICE(A0),A1     ; set current device handle
  194.         MOVE.W  device.handle(A1),cb.V_CONTRL.handle(A0)
  195.         LEA     cb.V_CONTRL(A0),A0      ; Build up the control Array
  196.         MOVE.W  #POLYMARKER,(A0)+
  197.         MOVE.W  #1,(A0)+
  198.         CLR.L   (A0)+
  199.         CLR.L   (A0)
  200.         JSR     vdi_call
  201. ende
  202.   END;
  203. END Mark;
  204.  
  205. PROCEDURE CellArray (handle:DeviceHandle; frame:Rectangle;
  206.                      rowLength,usedElems,noRows:CARDINAL;
  207.                      mode:WritingMode; REF colArray:ARRAY OF CARDINAL);
  208. BEGIN
  209.   ASSEMBLER
  210.         TRAP    #noErrorTrap
  211.         DC.W    MOSGlobals.IllegalCall
  212.   END
  213. END CellArray;
  214.  
  215. PROCEDURE GrafText(handle:DeviceHandle;start:Point;REF text:ARRAY OF CHAR);
  216.  
  217. BEGIN
  218.   ASSEMBLER
  219.         MOVE.L  D4,-(A7)
  220.         CLR.W   D4                      ; Kein Offset
  221.         JSR     stringIntoINTIN         ; 'text' -> vINTIN
  222.         MOVE.L  our_cb,A0
  223.         MOVE.W  -(A3),cb.V_CONTRL.sintin(A0) ; length(text) -> ctrl-array
  224.         MOVE.L  pubs,A0
  225.         MOVE.L  -(A3),pubArrays.PTSIN(A0)      ; start -> ptsin(0)+(1)
  226.         
  227.         SUBQ.L  #2,A7           ; device handle setzen
  228.         MOVE.L  A7,(A3)+
  229.         JSR     setDevice
  230.         TST.W   (A7)+
  231.         BEQ     ende
  232.         
  233.         MOVE.L  our_cb,A0
  234.         MOVE.W  #GRAF_TEXT,cb.V_CONTRL.opcode(A0)
  235.         MOVE.W  #1,cb.V_CONTRL.sptsin(A0)
  236.         MOVE.L  cb.CURDEVICE(A0),A1             ; set current device handle
  237.         MOVE.W  device.handle(A1),cb.V_CONTRL.handle(A0)
  238.         MOVE.L  A0,(A3)+
  239.         JSR     vdi_call
  240.         MOVE.L  (A7)+,D4
  241. ende
  242.   END;
  243. END GrafText;
  244.  
  245. PROCEDURE ContourFill(handle:DeviceHandle;start:Point;tagColor:CARDINAL;
  246.                       useTag:BOOLEAN);
  247.  
  248. BEGIN
  249.   ASSEMBLER
  250.         TST.W   -(A3)
  251.         BNE     cont
  252.         MOVE.W  #-1,-2(A3)
  253. cont
  254.         MOVE.L  pubs,A0
  255.         MOVE.W  -(A3),pubArrays.vINTIN(A0)
  256.         MOVE.L  -(A3),pubArrays.PTSIN(A0)
  257.         MOVE.W  #CONTOUR_FILL,(A3)+
  258.         CLR.W   (A3)+
  259.         JSR     vdi_if
  260.   END;
  261. END ContourFill;
  262.  
  263. PROCEDURE FillRectangle(handle:DeviceHandle;frame:Rectangle);
  264.  
  265. BEGIN
  266.   ASSEMBLER
  267.     MOVE.L      pubs,A0
  268.     LEA         pubArrays.PTSIN+8(A0),A1
  269.     JSR         getCalcedFrame
  270.     MOVE.W      #FILL_RECTANGLE,(A3)+
  271.     CLR.W       (A3)+
  272.     JSR         vdi_if
  273.   END;
  274. END FillRectangle;
  275.  
  276.  
  277.                 (*  Generalized Drawing Primitives  *)
  278.                 (*  ==============================  *)
  279.  
  280. PROCEDURE Bar(handle:DeviceHandle;frame:Rectangle);
  281.  
  282. BEGIN
  283.   ASSEMBLER
  284.     MOVE.L      pubs,A0
  285.     LEA         pubArrays.PTSIN+8(A0),A1
  286.     JSR         getCalcedFrame
  287.     MOVE.W      #GRAF_STANDARD,(A3)+
  288.     MOVE.W      #BAR,(A3)+
  289.     JSR         vdi_if
  290.   END;
  291. END Bar;
  292.  
  293. PROCEDURE callArcPie(middle:Point;radius,beg,end:CARDINAL);
  294.  
  295. BEGIN
  296.   ASSEMBLER
  297.     MOVE.L      pubs,A0
  298.     MOVE.L      -(A3),pubArrays.vINTIN(A0)
  299.     LEA         pubArrays.PTSIN+$10(A0),A0
  300.     CLR.W       -(A0)
  301.     MOVE.W      -(A3),-(A0)
  302.     CLR.L       -(A0)
  303.     CLR.L       -(A0)
  304.     MOVE.L      -(A3),-(A0)
  305.     MOVE.W      #GRAF_STANDARD,(A3)+
  306.   END;
  307. END callArcPie;
  308.  
  309. PROCEDURE Arc(handle:DeviceHandle;middle:Point;radius,beg,end:CARDINAL);
  310.  
  311. BEGIN
  312.   ASSEMBLER
  313.     JSR         callArcPie
  314.     MOVE.W      #ARC,(A3)+
  315.     JSR         vdi_if
  316.   END;
  317. END Arc;
  318.  
  319. PROCEDURE Pie(handle:DeviceHandle;middle:Point;radius,beg,end:CARDINAL);
  320.  
  321. BEGIN
  322.   ASSEMBLER
  323.     JSR         callArcPie
  324.     MOVE.W      #PIE,(A3)+
  325.     JSR         vdi_if
  326.   END;
  327. END Pie;
  328.  
  329. PROCEDURE Circle(handle:DeviceHandle;middle:Point;radius:CARDINAL);
  330.  
  331. BEGIN
  332.   ASSEMBLER
  333.     MOVE.L      pubs,A0
  334.     LEA         pubArrays.PTSIN+$C(A0),A0
  335.     CLR.W       -(A0)
  336.     MOVE.W      -(A3),-(A0)
  337.     CLR.L       -(A0)
  338.     MOVE.L      -(A3),-(A0)
  339.     MOVE.W      #GRAF_STANDARD,(A3)+
  340.     MOVE.W      #CIRCLE,(A3)+
  341.     JSR         vdi_if
  342.   END;
  343. END Circle;
  344.  
  345. PROCEDURE Ellipse(handle:DeviceHandle;middle:Point;xradius,yradius:CARDINAL);
  346.  
  347. BEGIN
  348.   ASSEMBLER
  349.     MOVE.L      pubs,A0
  350.     LEA         pubArrays.PTSIN+$8(A0),A0
  351.     MOVE.L      -(A3),-(A0)
  352.     MOVE.L      -(A3),-(A0)
  353.     MOVE.W      #GRAF_STANDARD,(A3)+
  354.     MOVE.W      #ELLIPSE,(A3)+
  355.     JSR         vdi_if
  356.   END;
  357. END Ellipse;
  358.  
  359. PROCEDURE ElliptArc(handle:DeviceHandle;middle:Point;xradius,yradius,beg,end:CARDINAL);
  360.  
  361. BEGIN
  362.   ASSEMBLER
  363.     MOVE.L      pubs,A0
  364.     MOVE.L      -(A3),pubArrays.vINTIN(A0)
  365.     LEA         pubArrays.PTSIN+$8(A0),A0
  366.     MOVE.L      -(A3),-(A0)
  367.     MOVE.L      -(A3),-(A0)
  368.     MOVE.W      #GRAF_STANDARD,(A3)+
  369.     MOVE.W      #ELLIPTICAL_ARC,(A3)+
  370.     JSR         vdi_if
  371.   END;
  372. END ElliptArc;
  373.  
  374. PROCEDURE ElliptPie(handle:DeviceHandle;middle:Point;xradius,yradius,beg,end:CARDINAL);
  375.  
  376. BEGIN
  377.   ASSEMBLER
  378.     MOVE.L      pubs,A0
  379.     MOVE.L      -(A3),pubArrays.vINTIN(A0)
  380.     LEA         pubArrays.PTSIN+$8(A0),A0
  381.     MOVE.L      -(A3),-(A0)
  382.     MOVE.L      -(A3),-(A0)
  383.     MOVE.W      #GRAF_STANDARD,(A3)+
  384.     MOVE.W      #ELLIPTICAL_PIE,(A3)+
  385.     JSR         vdi_if
  386.   END;
  387. END ElliptPie;
  388.  
  389. PROCEDURE RoundRect(handle:DeviceHandle;frame:Rectangle);
  390.  
  391. BEGIN
  392.   ASSEMBLER
  393.     MOVE.L      pubs,A0
  394.     LEA         pubArrays.PTSIN+8(A0),A1
  395.     JSR         getCalcedFrame
  396.     MOVE.W      #GRAF_STANDARD,(A3)+
  397.     MOVE.W      #ROUNDED_RECT,(A3)+
  398.     JSR         vdi_if
  399.   END;
  400. END RoundRect;
  401.  
  402. PROCEDURE FillRoundRect(handle:DeviceHandle;frame:Rectangle);
  403.  
  404. BEGIN
  405.   ASSEMBLER
  406.     MOVE.L      pubs,A0
  407.     LEA         pubArrays.PTSIN+8(A0),A1
  408.     JSR         getCalcedFrame
  409.     MOVE.W      #GRAF_STANDARD,(A3)+
  410.     MOVE.W      #FILL_ROUND_RECT,(A3)+
  411.     JSR         vdi_if
  412.   END;
  413. END FillRoundRect;
  414.  
  415. PROCEDURE JustifiedText(handle:DeviceHandle;start:Point;length:CARDINAL;
  416.                         wSpace,cSpace:BOOLEAN;REF str:ARRAY OF CHAR);
  417.                         
  418. BEGIN
  419.   ASSEMBLER
  420.         MOVE.L  D4,-(A7)
  421.         
  422.         MOVEQ   #2,D4                   ; 2 Elemente Offset
  423.         JSR     stringIntoINTIN
  424.         MOVE.W  -(A3),D0
  425.         MOVE.L  pubs,A0
  426.         MOVE.L  -(A3),pubArrays.vINTIN(A0)      ; wSp., cSp -> vINTIN(0)+(1)
  427.         MOVE.W  -(A3),pubArrays.PTSIN+4(A0)    ; length -> ptsin(2)
  428.         MOVE.L  -(A3),pubArrays.PTSIN(A0)      ; start -> ptsin(0)+(1)
  429.         ADDQ.W  #2,D0
  430.         MOVE.L  our_cb,A0
  431.         MOVE.W  D0,cb.V_CONTRL.sintin(A0) ; strlen(in vINTIN) -> ctrl-array
  432.         
  433.         SUBQ.L  #2,A7           ; device handle setzen
  434.         MOVE.L  A7,(A3)+
  435.         JSR     setDevice
  436.         TST.W   (A7)+
  437.         BEQ     ende
  438.         
  439.         MOVE.L  our_cb,A0
  440.         MOVE.W  #GRAF_STANDARD,cb.V_CONTRL.opcode(A0)
  441.         MOVE.W  #JUST_TEXT,cb.V_CONTRL.subcmd(A0)
  442.         MOVE.W  #2,cb.V_CONTRL.sptsin(A0)
  443.         MOVE.L  cb.CURDEVICE(A0),A1     ; set current device handle
  444.         MOVE.W  device.handle(A1),cb.V_CONTRL.handle(A0)
  445.         MOVE.L  A0,(A3)+
  446.         JSR     vdi_call
  447. ende
  448.         MOVE.L  (A7)+,D4
  449.   END;
  450. END JustifiedText;
  451.  
  452. END VDIOutputs.
  453. (* $00000457$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$000018C8$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5$FFF8B6E5Ç$000000EBT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000001C0$0000018D$000001A0$0000010C$000028FD$00000033$00000D66$00000896$000008F1$FFEB3024$00000918$000008F1$000009D6$00000A3A$00000AE3$000000EBÉÇâ*)
  454.